// SAX locator interface for document events.
// http://www.saxproject.org
// No warranty; no copyright -- use this as you will.
// $Id: Locator.java,v 1.8 2002/01/30 21:13:47 dbrownell Exp $

namespace Sax
{
    /// <summary>
    /// Interface for associating a SAX event with a document location.
    /// </summary>
    /// <remarks>
    /// <em>This module, both source code and documentation, is in the
    /// Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
    /// See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
    /// for further information.
    /// <para/>
    /// If a SAX parser provides location information to the SAX
    /// application, it does so by implementing this interface and then
    /// passing an instance to the application using the content
    /// handler's <see cref="IContentHandler.SetDocumentLocator(ILocator)"/>
    /// method.The application can use the
    /// object to obtain the location of any other SAX event
    /// in the XML source document.
    /// <para/>
    /// Note that the results returned by the object will be valid only
    /// during the scope of each callback method: the application
    /// will receive unpredictable results if it attempts to use the
    /// locator at any other time, or after parsing completes.
    /// <para/>
    /// SAX parsers are not required to supply a locator, but they are
    /// very strongly encouraged to do so.  If the parser supplies a
    /// locator, it must do so before reporting any other document events.
    /// If no locator has been set by the time the application receives
    /// the <see cref="IContentHandler.StartDocument()"/>
    /// event, the application should assume that a locator is not
    /// available.
    /// </remarks>
    /// <since>SAX 1.0</since>
    /// <author>David Megginson</author>
    /// <version>2.0.1 (sax2r2)</version>
    /// <seealso cref="IContentHandler.SetDocumentLocator(ILocator)"/>
    public interface ILocator
    {
        /// <summary>
        /// Gets the public identifier for the current document event.
        /// <para/>
        /// The return value is the public identifier of the document
        /// entity or of the external parsed entity in which the markup
        /// triggering the event appears.
        /// <para/>
        /// Returns a string containing the public identifier, or null if none is available.
        /// </summary>
        /// <seealso cref="SystemId"/>
        string PublicId { get; }

        /// <summary>
        /// Return the system identifier for the current document event.
        /// <para/>
        /// The return value is the system identifier of the document
        /// entity or of the external parsed entity in which the markup
        /// triggering the event appears.
        /// <para/>If the system identifier is a URL, the parser must resolve it
        /// fully before passing it to the application.  For example, a file
        /// name must always be provided as a <em>file:...</em> URL, and other
        /// kinds of relative URI are also resolved against their bases.
        /// <para/>
        /// Returns a string containing the system identifier, or null
        /// if none is available.
        /// </summary>
        /// <seealso cref="PublicId"/>
        string SystemId { get; }

        /// <summary>
        /// Return the line number where the current document event ends.
        /// Lines are delimited by line ends, which are defined in
        /// the XML specification.
        /// <para/>
        /// <strong>Warning:</strong> The return value from the method
        /// is intended only as an approximation for the sake of diagnostics;
        /// it is not intended to provide sufficient information
        /// to edit the character content of the original XML document.
        /// In some cases, these "line" numbers match what would be displayed
        /// as columns, and in others they may not match the source text
        /// due to internal entity expansion.
        /// <para/>
        /// The return value is an approximation of the line number
        /// in the document entity or external parsed entity where the
        /// markup triggering the event appears.
        /// <para/>
        /// If possible, the SAX driver should provide the line position
        /// of the first character after the text associated with the document
        /// event.  The first line is line 1.
        /// <para/>
        /// Returns the line number, or -1 if none is available.
        /// </summary>
        /// <seealso cref="ColumnNumber"/>
        int LineNumber { get; }

        /// <summary>
        /// Return the column number where the current document event ends.
        /// This is one-based number of Java<code>char</code> values since
        /// the last line end.
        /// <para/>
        /// <strong>Warning:</strong> The return value from the method
        /// is intended only as an approximation for the sake of diagnostics;
        /// it is not intended to provide sufficient information
        /// to edit the character content of the original XML document.
        /// For example, when lines contain combining character sequences, wide
        /// characters, surrogate pairs, or bi-directional text, the value may
        /// not correspond to the column in a text editor's display.
        /// <para/>
        /// The return value is an approximation of the column number
        /// in the document entity or external parsed entity where the
        /// markup triggering the event appears.
        /// <para/>
        /// If possible, the SAX driver should provide the line position
        /// of the first character after the text associated with the document
        /// event.  The first column in each line is column 1.
        /// <para/>
        /// Returns the column number, or -1 if none is available.
        /// </summary>
        /// <seealso cref="LineNumber"/>
        int ColumnNumber { get; }
    }
}
